package generic;

/**
 * @author DCSGO
 * @version 1.0
 * 自定义泛型类
 */
public class Generic03 {
    //基本语法：
/*
class 类名<T,R,...>{

}
*/
//注意：
//1. 泛型类的类型参数不能用于被 static 修饰的属性、方法
//2. 使用泛型的数组不能就地初始化
//3. 泛型类的类型参数在创建对象时确定
//4. 如果在创建对象时没有指定类型参数 默认为 Object
    public static void main(String[] args) {
        TestClass<Double, String> testClass = new TestClass<>();
        System.out.println(testClass.t);//null
        System.out.println(testClass.r);//null
        TestClass<Double, String> testClass1 = new TestClass<>(1.1, "HI");
        testClass1.showTClass();//class java.lang.Double
        testClass1.showRClass();//class java.lang.String

        testClass1.setT(2.3);
        //testClass1.setT(2.3F); //编译错误

        testClass1.setR("hello");
        //testClass1.setR(1);//编译错误

        //TestClass<Double,String>.putT(111);//编译错误
        TestClass.putT("hi");
    }
}

class TestClass<T, R> {
    T t;
    R r;
    //static R r1; //编译错误
    static int r2;

    T[] ts;

    public void setT(T t) {
        this.t = t;
    }

    public R getR() {
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }

    //R[] rs=new R[10];//编译错误 参数类型不能直接实例化
    public T getT() {
        //return new T(); //编译错误 类型参数不能直接实例化
        return t;
    }

    /*public static R getR(){
        return r;
    }*/ //编译错误

    public TestClass(T t, R r) {
        this.t = t;
        this.r = r;
    }

    public TestClass() {
    }

    public void showTClass() {
        System.out.println(t.getClass());
    }

    public static <T> void putT(T r) {//使用的不是类 的 类型参数T
        System.out.println(r);
    }

    public void showRClass() {
        System.out.println(r.getClass());
    }
}



